Firebase Admin Node.js SDKによるメッセージ送信処理のユニットテストをJestで書いてみた
こんにちは、CX事業本部 IoT事業部の若槻です。
今回は、Firebase Admin Node.js SDKによるメッセージ送信処理のユニットテストをJestで書いてみました。
やってみた
環境
$ npm ls typescript jest firebase-admin --depth=0 hoge-project@0.1.0 /Users/wakatsuki.ryuta/projects/cm-rwakatsuki/hoge-project ├── firebase-admin@10.2.0 ├── jest@26.6.3 └── typescript@3.9.10
テスト対象コード
Firebase Admin Node.js SDKで、Firebase Cloud Messagingによるメッセージ送信を行う処理です。
initializeApp
によるデフォルトアプリが重複して作成されないように、firebaseAdmin.apps.length === 0
の時にのみinitializeApp
を実行するようにしています。
テストコード
前述のコードに対するテストコードは次のように書きました。
firebaseAdmin.initializeApp
のモックの戻り値にfirebaseAdmin.initializeApp()
を指定しているため、テスト対象のモジュール呼び出し時にはデフォルトアプリは既に作成された扱いとなっており、if分岐内は実行されません。
テストを実行するとすべてPASSしました!
$ npx jest PASS test/send-firevase-message.test.ts (5.566 s) ✓ sendMessage (15 ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 total Time: 5.63 s, estimated 6 s Ran all test suites.
実行が失敗するパターン
firebaseAdmin.initializeApp
のmockReturnValue
をundefined
とした場合、テスト対象コードのif分岐内の処理は実行されるでしょうか。
テストを実行してみると、そもそも次行のfirebaseAdmin.messaging().send
のモック時にデフォルトアプリが無いためエラーとなりました。
$ npx jest FAIL test/send-firevase-message.test.ts (5.531 s) ● sendMessage The default Firebase app does not exist. Make sure you call initializeApp() before using any of the Firebase services. 7 | .fn() 8 | .mockReturnValue(undefined); > 9 | (firebaseAdmin.messaging().send as jest.Mock) = jest | ^ 10 | .fn() 11 | .mockReturnValue(undefined); 12 | at FirebaseAppError.FirebaseError [as constructor] (node_modules/firebase-admin/lib/utils/error.js:44:28) at FirebaseAppError.PrefixedFirebaseError [as constructor] (node_modules/firebase-admin/lib/utils/error.js:90:28) at new FirebaseAppError (node_modules/firebase-admin/lib/utils/error.js:125:28) at AppStore.Object.<anonymous>.AppStore.getApp (node_modules/firebase-admin/lib/app/lifecycle.js:67:19) at FirebaseNamespaceInternals.Object.<anonymous>.FirebaseNamespaceInternals.app (node_modules/firebase-admin/lib/app/firebase-namespace.js:54:33) at FirebaseNamespace.Object.<anonymous>.FirebaseNamespace.app (node_modules/firebase-admin/lib/app/firebase-namespace.js:321:30) at FirebaseNamespace.Object.<anonymous>.FirebaseNamespace.ensureApp (node_modules/firebase-admin/lib/app/firebase-namespace.js:335:24) at FirebaseNamespace.fn (node_modules/firebase-admin/lib/app/firebase-namespace.js:131:30) at Object.<anonymous> (test/send-firevase-message.test.ts:9:18) Test Suites: 1 failed, 1 total Tests: 1 failed, 1 total Snapshots: 0 total Time: 5.597 s, estimated 6 s Ran all test suites.
おわりに
Firebase Admin Node.js SDKによるメッセージ送信処理のユニットテストをJestで書いてみました。
AWS SDKとは勝手が異なるためモックの仕方でとても試行錯誤をしました。もっと良いテスト方法があれば教えて頂きたいです。
以上